package bancosys.tec.exception;

import java.util.Locale;

/**
 * Classe abstrata que RuntimeExceptions devem especializar. Guarda no message a chave do arquivo de i18n e os eventuais argumentos.
 * 
 * @author jrenaut
 * @since 06/06/08
 */
public abstract class AbstractRuntimeException extends RuntimeException {

    private static final long serialVersionUID = -2012774518603087573L;

    private LocalizedMessageHolder messageHolder;

    /**
     * Construtor
     * 
     * @param messageHolder messageHolder
     */
    public AbstractRuntimeException(final LocalizedMessageHolder messageHolder) {
        super();
        this.messageHolder = messageHolder;
    }

    /**
     * Construtor
     * 
     * @param messageHolder messageHolder
     * @param cause cause
     */
    public AbstractRuntimeException(final LocalizedMessageHolder messageHolder, final Throwable cause) {
        super(cause);
        this.messageHolder = messageHolder;
    }

    /**
     * Construtor
     * 
     * @param key A CHAVE do arquivo de i18n.
     * @param arguments ARGUMENTOS da mensagem, se houver.
     * @deprecated Use constructors that receive LocalizedMessageHolder
     */
    @Deprecated
    public AbstractRuntimeException(final String key, final Object... arguments) {
        super(key);
        this.messageHolder = new MessageHolder(this.getBundleBaseName(), key, arguments);
    }

    /**
     * Construtor
     * 
     * @param key A CHAVE do arquivo de i18n.
     * @param cause a CAUSA desta exception.
     * @param arguments ARGUMENTOS da mensagem, se houver.
     * @deprecated Use constructors that receive LocalizedMessageHolder
     */
    @Deprecated
    public AbstractRuntimeException(final String key, final Throwable cause, final Object... arguments) {
        super(key, cause);
        this.messageHolder = new MessageHolder(this.getBundleBaseName(), key, arguments);
    }

    /**
     * Retorna o nome do arquivo de i18n que deve ser usado para localizar a mensagem. Este arquivo será procurado no classpath.
     * 
     * @return String
     */
    public String getBundleBaseName() {
        throw new UnsupportedOperationException("No bundle base name");
    }

    /**
     * Retorna a mensagem convertida no default locale. Caso não seja possível, devolve a chave.
     * 
     * @return A mensagem ou a chave.
     */
    @Override
    public String getMessage() {
        return this.getLocalizedMessageHolder().getMessage();
    }

    /**
     * Retorna a mensagem convertida no default locale. Caso não seja possível, devolve a chave.
     * 
     * @param locale Locale
     * @return A mensagem ou a chave.
     */
    public String getMessage(final Locale locale) {
        return this.getLocalizedMessageHolder().getMessage(locale);
    }

    /**
     * @return LocalizedMessageHolder
     */
    public LocalizedMessageHolder getLocalizedMessageHolder() {
        return this.messageHolder;
    }
}
